package a66weding.com.jiehuntong.common;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.support.annotation.ColorInt;
import android.support.annotation.DrawableRes;
import android.support.annotation.IdRes;
import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
import android.util.SparseArray;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;

import a66weding.com.jiehuntong.common.utils.Tools;

/**
 * Created by Administrator on 2016/1/30.
 */
public class MyViewHolder  {

    private  View convertView;
    private View findView;
    private SparseArray<Object> tags;

    /**
     * 私有构造器, 不被外部调用, 只允许通过 getHolder() 方法获取 ViewHolder 对象
     * @param context 上下文对象
     * @param layoutId 某个Item的布局layoutId
     */
    private MyViewHolder (Context context, int layoutId){
        tags = new SparseArray<>();
        findView=  convertView = View.inflate(context, layoutId, null);
        convertView.setTag(this);
    }

    /**
     *返回当前 convertView: 就是 ListView 的 Item 视图
     * @return convertView
     */
    public  View getConvertView(){
        return convertView;
    }

    /**
     * 获取一个 ViewHolder 对象
     * 如果 convertView 为 null 就调用构造方法创建一个 ViewHolder 对象
     * 如果 convertView 不为 null 表示是复用的 Item, 直接去 Tag 中取 ViewHolder 对象
     * @param context 上下文对象
     * @param convertView ListView中getView()可以复用的convertView
     * @param layoutId 某个Item的布局layoutId
     * @return MyViewHolder holder
     */
    public static MyViewHolder getHolder(@NonNull Context context,
                                         @Nullable View convertView,
                                         @LayoutRes int layoutId) {
        if(null==convertView){
         return  new MyViewHolder(context,layoutId);
        }
        return (MyViewHolder) convertView.getTag();
    }


    /**
     * 根据viewId 获取一个 View 对象
     * @param viewId
     * @return View（某个Item的子view）
     */
    public View getView(int viewId){
        View view;
        Object objView = tags.get(viewId);
        if(null==objView){
            view=findView.findViewById(viewId);
            tags.put(viewId,view);
        }else{
            view= (View) objView;
        }

        return view;
    }

    /**
     * 返回当前 findView: 表示 getView() 方法从哪个视图上取一个视图对象
     * 默认和 convertView 是同一个对象, 当使用 setFindViewAt() 方法后就是 convertView 的某一个子视图
     * @return findView 某个item
     */
    public View getFindView(){
        return findView;
    }

    /**
     * 设置从 convertView 指定位置的子视图上 getView()
     * getView() 方法将从该子视图上 findViewById()
     * 设置 index 为负数时, 将直接从 convertView 上 findViewById()
     * @param index
     * @return MyViewHolder holder
     */
    public MyViewHolder setFindViewAt(int index) {
        if(index >=0 && convertView instanceof ViewGroup){
            ViewGroup viewGroup= (ViewGroup)this.convertView;
            if(index<viewGroup.getChildCount()){
                findView=viewGroup.getChildAt(index);
            }else{
                throw new RuntimeException("invalid index");
            }
        }else{
            findView=this.convertView;
        }
        return this;
    }


    /**
     * 根据 viewId 获取一个 ImageView 对象
     * @param viewId
     * @return ImageView（某个Item的子view--ImageView）
     */
    public ImageView getImageView(@IdRes int viewId) {
        return (ImageView) getView(viewId);
    }

    /**
     * 根据 viewId 获取一个 TextView 对象
     * @param viewId
     * @return TextView（某个Item的子view--TextView）
     */
    public TextView getTextView(@IdRes int viewId) {
        return (TextView) getView(viewId);
    }

    /**
     * 根据 viewId 获取一个 CheckBox 对象
     * @param viewId
     *  @return CheckBox（某个Item的子view--CheckBox）
     */
    public CheckBox getCheckBox(@IdRes int viewId) {
        return (CheckBox) getView(viewId);
    }

    /**
     * 为指定 viewId 的 ImageView 对象设置图片
     * @param viewId
     * @param drawable
     *  @return MyViewHolder
     */
    public MyViewHolder setImageDrawable(@IdRes int viewId, @Nullable Drawable drawable) {
        getImageView(viewId).setImageDrawable(drawable);
        return this;
    }

    /**
     * 为指定 viewId 的 ImageView 对象设置图片
     * @param viewId
     * @param resId
     */
    public MyViewHolder setImageResource(@IdRes int viewId, @DrawableRes int resId) {
        getImageView(viewId).setImageResource(resId);
        return this;
    }

    /**
     * 为指定 viewId 的 TextView 对象设置文字
     * @param viewId
     * @param resid
     */
    public MyViewHolder setText(@IdRes int viewId, @StringRes int resid) {
        getTextView(viewId).setText(resid);
        return this;
    }

    /**
     * 为指定 viewId 的 TextView 对象设置文字
     * @param viewId int
     * @param text CharSequence
     */
    public MyViewHolder setText(@IdRes int viewId, CharSequence text) {
        getTextView(viewId).setText(text);
        return this;
    }

    /**
     * 为指定 viewId 的 TextView 对象设置文字颜色
     * @param viewId int
     *  @param color int
     */
    public MyViewHolder setTextColor(@IdRes int viewId, @ColorInt int color) {
        getTextView(viewId).setTextColor(color);
        return this;
    }

    /**
     * 为指定 viewId 的 View 对象设置 TAG
     *  @param viewId int
     *    @param tag Object
     */
    public MyViewHolder setTag(@IdRes int viewId, final Object tag) {
        getView(viewId).setTag(tag);
        return this;
    }

    /**
     * 为指定 viewId 的 View 对象设置背景图片
     *  @param viewId int
     *   @param resid int
     */
    public MyViewHolder setBackgroundResource(@IdRes int viewId, @DrawableRes int resid) {
        getView(viewId).setBackgroundResource(resid);
        return this;
    }

    /**
     * 使用当前 ViewHolder 记录一个 TAG
     */
    public MyViewHolder putTag(int key, final Object tag) {
        tags.put(key, tag);
        return this;
    }

    /**
     * 从当前 ViewHolder 中取出一个TAG
     */
    public Object getTag(int key) {
        return tags.get(key);
    }

    /**
     * 为指定 viewId 的 CheckBox 对象设置选中状态
     * @param viewId int
     * @param checked boolean
     */
    public MyViewHolder setChecked(@IdRes int viewId, boolean checked) {
        getCheckBox(viewId).setChecked(checked);
        return this;
    }

    /**
     * 切换指定 viewId 的 CheckBox 的选中状态
     * @param  viewId int
     */
    public MyViewHolder toggle(@IdRes int viewId) {
        getCheckBox(viewId).toggle();
        return this;
    }

    /**
     * 为指定 viewId 的 View 对象设置点击监听
     * @param  viewId int
     * @param   listener View.OnClickListener
     */
    public MyViewHolder setOnClickListener(@IdRes int viewId, @Nullable View.OnClickListener listener) {
        getView(viewId).setOnClickListener(listener);
        return this;
    }

    /**
     * 为指定 viewId 的 View 对象设置是否可见
     * @param  viewId int
     * @param  visible boolean
     */
    public MyViewHolder setVisibile(@IdRes int viewId, boolean visible) {
        getView(viewId).setVisibility(visible ? View.VISIBLE : View.GONE);
        return this;
    }

    /**
     * 为指定 viewId 的 View 对象设置是否可见
     * @param  viewId int
     * @param  visibility int
     */
    public MyViewHolder setVisibility(@IdRes int viewId, int visibility) {
        getView(viewId).setVisibility(visibility);
        return this;
    }

    /**
     * 为指定 viewId 的 View 对象设置是否可见
     * @param  viewId int
     * @param  params ViewGroup.LayoutParams
     */
    public MyViewHolder setLayoutParams(@IdRes int viewId, ViewGroup.LayoutParams params) {
        getView(viewId).setLayoutParams(params);
        return this;
    }


}
